<?php

// 示例模板信息
/*
短信签名1：BOC
短信签名2：闰能科技
 */
/*
模版内容:尊敬的用户您好，您的验证码为：${code}，5分钟内有效！
模板ID:SMS_138072489
 */
/*
模版内容:业务[${info}] 报警提醒，设置的${remark}已达到
模板ID:SMS_152284975
 */

/*$sms           = new SendSms(); //实例化SendSms类
$mobile        = '13032982125'; //接收短信的手机号码
$boc           = 'SN'; //行标示
$salt          = 'OISIOFIOSL'; //约定生成签名的盐值
$signName      = '闰能科技'; //短信签名
$templateCode  = 'SMS_152284975'; //短信模板ID
$templateParam = array('info' => '测试', 'remark' => '警戒值'); //短信模板参数，数组键名必须与短信模板中的变量名一致
$remark        = '测试'; //备注，用于区分活动
$result        = $sms->requestApi($mobile, $boc, $salt, $signName, $templateCode, $templateParam, $remark); //调用SendSms的requestApi方法发送短信

print_r($result); //打印发送结果信息*/

/**
 *请求远程接口发送短信
 */
class SendSms
{
    private $url = 'http://smsapi.snrunning.cn/rn_sms/sendSms.php'; //接口地址

    /**
     * 调用发送短信接口
     * @param  string  $mobile             接收短信的手机号码（必须）
     * @param  string  $boc                行标示（必须）
     * @param  string  $signName           短信签名 （可选）
     * @param  string  $templateCode       短信模板ID（可选）
     * @param  string  $templateParam      短信参数（可选）短信模板中有变量则必须
     * @param  string  $remark             备注，用于区分活动
     * @return string                      接口返回信息
     */
    public function requestApi($mobile, $boc, $salt, $signName = 'BOC', $templateCode = 'SMS_138072489', $templateParam = array(), $remark = '')
    {
        /**
         * 组装接口参数
         * @var array
         */
        $parameter = array(
            'mobile'        => $mobile, //接收短信的手机号码
            'boc'           => $boc, //行标示
            'sign'          => md5($boc . $mobile . $salt), //验证的签名
            'signName'      => $signName, //短信签名
            'templateCode'  => $templateCode, //短信模板ID
            'templateParam' => json_encode($templateParam), //短信模板参数
            'remark'        => $remark,
        );

        $response = $this->fetchContent($this->url, 'POST', $parameter); //使用curl发送POST请求（调用短信接口）

        return $response; //返回接口响应信息
    }

    /**
     * 发送curl请求
     * @param  string $url    请求地址
     * @param  string $method 请求方式 可选值:POST、GET
     * @param  string $body   向目标服务器发送的参数 （可选）
     * @return string         响应信息
     */
    public function fetchContent($url, $method = 'GET', $body = '')
    {
        $ch = curl_init();

        if ($method == 'POST') {
            curl_setopt($ch, CURLOPT_POST, 1); //post提交方式
            curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        if (substr($url, 0, 5) == 'https') {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }

        $rtn = curl_exec($ch);

        if ($rtn === false) {
            // 大多由设置等原因引起，一般无法保障后续逻辑正常执行，
            // 所以这里触发的是E_USER_ERROR，会终止脚本执行，无法被try...catch捕获，需要用户排查环境、网络等故障
            trigger_error("[CURL_" . curl_errno($ch) . "]: " . curl_error($ch), E_USER_ERROR);
        }
        curl_close($ch);

        return $rtn;
    }
}
